package models;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import controllers.Application;

import play.db.jpa.Model;

@Entity
public class Anuncio extends Model implements Comparable {

	public int desk_id;
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataVencimento;
	@Temporal(TemporalType.TIMESTAMP)
	private Date dataPublicacao;

	@ManyToOne
	public Imovel imovel;

	public Anuncio(Date dataVencimento, Date dataPublicacao, Imovel imovel) {
		// TODO Auto-generated constructor stub
		this.dataPublicacao = dataPublicacao;
		this.dataVencimento = dataVencimento;
		this.imovel = imovel;
	}

	public Anuncio() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Metodo vindouro da interface Comparable. Serve para ordenar uma colecao
	 * de objetos. Ordena os Contatos pela data de inclusao, decrescente.
	 * 
	 * @see Application#index()
	 */
	@Override
	public int compareTo(Object o) {
		Anuncio a = (Anuncio) o;
		if (this.dataPublicacao.after(a.dataPublicacao))
			return -1;
		else if (this.dataPublicacao.before(a.dataPublicacao))
			return 1;
		else
			return 0;
	}

	public static List<Anuncio> sincronizar(ArrayList anuncios) {
		List sincronizados = new ArrayList();
		System.out.println(anuncios.size());
		for (int i = 0; i <= anuncios.size() - 1; i++) {
			Anuncio a = (Anuncio) anuncios.get(i);
			try {
				Anuncio novo = new Anuncio();
				if ((Anuncio) Anuncio.find("byDesk_Id", a.desk_id).first() != null) {
					novo = (Anuncio) Anuncio.find("byDesk_Id", a.desk_id)
							.first();
					novo.imovel.bairro = a.imovel.bairro;
					novo.imovel.cep = a.imovel.cep;
					novo.imovel.areaTotal = a.imovel.areaTotal;
					novo.imovel.comprimento = a.imovel.comprimento;
					novo.imovel.dataPublicacao = a.imovel.dataPublicacao;
					novo.imovel.descricao = a.imovel.descricao;
					novo.imovel.largura = a.imovel.largura;
					novo.imovel.quartos = a.imovel.quartos;
					novo.imovel.status = a.imovel.status;
					novo.imovel.tipoImovel = a.imovel.tipoImovel;
					novo.imovel.usuario = a.imovel.usuario;
					novo.imovel.vagasGaragem = a.imovel.vagasGaragem;
					novo.imovel.valor = a.imovel.valor;
					novo.imovel.bairro.cidade.estado.save();
					novo.imovel.bairro.cidade.save();
					novo.imovel.bairro.save();
					novo.imovel.tipoImovel.save();
					novo.imovel.save();
					sincronizar(novo);
					continue;
				}
				novo = a;

				novo.imovel.bairro.cidade.estado.save();
				novo.imovel.bairro.cidade.save();
				novo.imovel.bairro.save();
				novo.imovel.tipoImovel.save();
				novo.imovel.save();
				novo.save();

				sincronizados.add(novo);
			} catch (Exception localException) {
				System.out.print(localException.getMessage());
			}
		}
		return sincronizados;
	}

	public static String sincronizar(Anuncio anuncio) {
		String result = "";

		try {
			if ((anuncio instanceof Anuncio)) {
				anuncio.save();

				result = "Sincronização realizada com sucesso";
			}

			result = "Sincronização falhou. Objeto passado inválido.";
		} catch (Exception e) {
			result = e.getMessage();
		}

		return result;
	}

}
